package com.jhy.suixianglu.shuangzhizhen.daima20230118;

/**
 * 给你两个单链表的头节点 headA 和 headB ，
 * 请你找出并返回两个单链表相交的起始节点。如果两个链表没有交点，返回 null 。
 * 主要思想：
 * 1、先求出a节点的长度
 * 2、求出b节点的长度
 * 3、算出两个节点当中的差
 * 4、将a节点移动到b节点的同一位置
 * 5、然后共同移动相等就返回退出
 * 6、不相等的话就返回null
 */
public class GetIntersectionNode {
    public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
        ListNode curA = headA;
        ListNode curB = headB;
        // 为了不改变当前两个头节点的值 所以赋值给cur类型的节点
        // 统计两个节点的长度
        int countA = 0;
        int countB = 0;
        while (curA != null) {
            countA++;
            curA = curA.next;
        }
        while (curB != null) {
            countB++;
            curB = curB.next;
        }
        // 将cur重新归原
        curA = headA;
        curB = headB;
        // 让curA称为那个最长的节点
        if (countB > countA) {
            int temp = countA;
            countA = countB;
            countB = temp;

            ListNode listNode = curA;
            curA = curB;
            curB = listNode;
        }
        // 长度之差为：
        int len = countA - countB;
        while (len-- > 0) {
            curA = curA.next;
        }

        while (curA != null) {
            if (curA == curB) {
                return curA;
            }
            curA = curA.next;
            curB = curB.next;
        }
        return null;
    }
}
